package com.dayu.behavior.chain;

/**
 * 责任链模式:为请求创建了一个接收者对象的链。这种模式给予请求的类型，对请求的发送者和接收者进行解耦。
 * 在这种模式中，通常每个接收者都包含对另一个接收者的引用。如果一个对象不能处理该请求，那么它会把相同的请求传给下一个接收者，依此类推。
 */
public class ChainTest {

    /**
     * 避免请求发送者与接收者耦合在一起，让多个对象都有可能接收请求，将这些对象连接成一条链，并且沿着这条链传递请求，直到有对象处理它为止。
     * 优点：降低耦合度，将发送者和接受者进行解耦合；简化了对象，是对象不需要知道链的结构
     * 缺点：不能保证请求一定被接收；系统性能会收到一定影响，且代码调试也不太方便
     */

    /**
     * 主要解决：职责链上的处理者负责处理请求，客户只需要将请求发送到职责链上即可，无须关心请求的处理细节和请求的传递，所以职责链将请求的发送者和请求的处理者解耦了。
     */

    /**
     * Client(客户端)：实例化一个处理器的链，在第一个链对象中调用handleRequest 方法。
     * Handle(处理器)：抽象类，提供给实际处理器继承然后实现handleRequst方法，处理请求
     * ConcreteHandler(具体处理器)：继承了handler的类，同时实现handleRequst方法，负责处理业务逻辑类，不同业务模块有不同的ConcreteHandler。
     */

    /**
     * 实例场景：
     */

    public static void main(String[] args) {
        Approver first  = new FirstApprover("first");
        Approver second  = new FirstApprover("second");
        Approver third  = new FirstApprover("third");
        first.setApprover(second);
        second.setApprover(third);

        PurchaseRequest purchaseRequest = new PurchaseRequest(1, 9000);
        //调用链直接处理
        first.processRequest(purchaseRequest);

    }


}
